
package com.e885.hibernate;

import java.util.List;

/**
 * 分頁模組
 * 
 * @author Eric.Kao(gau168.gau@msa.hinet.net)
 * @version 1.0
 * @company E885 Group
 * @copyright Copyright (c) 2001-2008
 */

public class Pagination
{
	/**
	 * 1. 從 Dao 取得是存放 Persistence Bean.<br>
	 * 2. 從 Service 取得是存放 View Bean.
	 */
	private List results;

	/**
	 * 每頁筆數
	 */
	private int pageSize;

	/**
	 * 目前頁數, 起使值為 1
	 */
	private int page;

	/**
	 * 總筆數
	 */
	private int totalResults;

	/**
	 * constructor, 每頁筆數預設值為 10
	 * 
	 * @param results
	 * @param currentPage
	 * @param totalResults
	 */
	public Pagination( List results, int currentPage, int totalResults )
	{
		this( results, currentPage, 10, totalResults );
	}

	/**
	 * constructor
	 * 
	 * @param results
	 * @param page
	 * @param pageSize
	 * @param totalResults
	 */
	public Pagination( List results, int page, int pageSize, int totalResults )
	{
		this.results = results;
		this.page = page;
		this.pageSize = pageSize;
		this.totalResults = totalResults;
	}

	/**
	 * @return the currentPage
	 */
	public int getCurrentPage()
	{
		return page;
	}

	/**
	 * 取得目前頁的起始 number, 如: 每頁有10筆, 那麼第二頁的第一筆資料的 number=11
	 * 
	 * @return
	 */
	public int getFirstResultNumber()
	{
		return ( page - 1 ) * pageSize + 1;
	}

	/**
	 * 取得目前頁的結束 number, 如: 每頁有 10 筆, 那麼第二頁的最後一筆資料的 number= 20
	 * 
	 * @return
	 */
	public int getLastResultNumber()
	{
		int fullPage = getFirstResultNumber() + pageSize - 1;

		return totalResults < fullPage ? totalResults : fullPage;
	}

	/**
	 * 取得目前頁的資料.<br>
	 * 
	 * @return 從 Dao 取得, 是 Persistenc Bean. 從 Service 取得是 View Bean
	 */
	public List getList()
	{
		// 如果是最後一頁, 筆數只有3筆, 那麼我們只會取得3筆資料
		return hasNextPage() ? results.subList( 0, pageSize ) : results;
	}

	/**
	 * 取得每頁筆數
	 * 
	 * @return the pageSize
	 */
	public int getPageSize()
	{
		return pageSize;
	}

	/**
	 * @return the results
	 */
	public List getResults()
	{
		return results;
	}

	/**
	 * 取得總頁數
	 * 
	 * @return
	 */
	public int getTotalPage()
	{
		if( totalResults <= 0 )
			return 0;

		return ( totalResults - 1 ) / pageSize + 1;
	}

	/**
	 * 取得總筆數
	 * 
	 * @return the totalResults
	 */
	public int getTotalResults()
	{
		return totalResults;
	}

	/**
	 * 是否有下一頁
	 * 
	 * @return true, 有下一頁
	 */
	public boolean hasNextPage()
	{
		// 假設 pageSize =10 , 那麼系統會抓取 ( pageSize + 1 ) 筆資料, 如果傳回 11 筆資料, 那麼表示有下一頁.
		return results.size() > pageSize;
	}

	/**
	 * 是否有前一頁, 系統的頁碼起始值為 1
	 * 
	 * @return true, 有前一頁
	 */
	public boolean hasPreviouesPage()
	{
		return page > 1;
	}

	/**
	 * 是否為第一頁
	 * 
	 * @return true, 目前頁碼為第一頁
	 */
	public boolean isFirstPage()
	{
		// 系統頁碼的起始值為 1
		return page == 1;
	}

	/**
	 * 是否為最後一頁
	 * 
	 * @return true, 目前頁碼為最後一頁
	 */
	public boolean isLastPage()
	{
		return page >= getTotalPage();
	}

	/**
	 * @param results the results to set
	 */
	public void setResults( List results )
	{
		this.results = results;
	}
}
